package client;

import java.util.ArrayList;

import model.Conversacion;
import model.Notificacion;
import model.Usuario;
import protocol.MensajeComando;
import ar.unlam.com.cliente.PanelDeChat;

import comandos.AceptarAmistad;
import comandos.AgregoConversacion;
import comandos.AmigosEnComun;
import comandos.BloquearUsuario;
import comandos.BuscarUsuario;
import comandos.ComandoManejador;
import comandos.CrearUsuario;
import comandos.DesconectarDelServidor;
import comandos.EliminarAmigo;
import comandos.LoginUsuario;
import comandos.MeAgreganConversacion;
import comandos.MensajeChat;
import comandos.MensajeEnConvers;
import comandos.ObtenerAmigos;
import comandos.ObtenerNotificaciones;
import comandos.SolicitudDeAmistad;

public class Cliente 
{
	private ClienteSession sesion;
	private String direccionIp;
	private int puerto;
	private static Usuario usuario;
	
	public Cliente(String direccionIp, int puerto) throws Exception
	{
		this.direccionIp = direccionIp;
		this.puerto = puerto;
	}
	
	public boolean enviarMensajeSimpleServer(PanelDeChat panel)
	{
		if(panel.getMensajeTextField().getText().compareTo("") != 0){
			try {
				MensajeEnConvers envioMensaje = (MensajeEnConvers)ComandoManejador.obtenerComando("enviar_msj_convers");
				
				envioMensaje.setUsuario(Cliente.usuario);
				envioMensaje.setMensaje(panel.getMensajeTextField().getText());
				envioMensaje.setConversacionId(panel.getConversacionId());
				
				envioMensaje.ejecutar(this.sesion, false);
				
				return envioMensaje.getEstadoOperacion().getEstado()==1;
			}
			catch (Exception e)
			{
				System.out.println(e.getMessage());
				return false;
			}
		}
		return false;
	}
	
	public void eliminarAmigo(Usuario eliminado)
	{
		EliminarAmigo eliminar = (EliminarAmigo) ComandoManejador.obtenerComando("eliminar_amistad");
		eliminar.setEliminado(eliminado);
		eliminar.ejecutar(this.sesion, false);
	}
	
	public MensajeComando crearNuevoUsuario(Usuario u) 
	{
		//Abro una conexion al servidor
		try
		{			
			this.sesion = new ClienteSession(this.direccionIp, this.puerto);
		}
		catch (Exception e)
		{
			System.out.println(e.getMessage());
		}
		
		//Creo el usuario
		CrearUsuario comando = (CrearUsuario) ComandoManejador.obtenerComando("crear_usuario");
        comando.setUsuario(u);
        comando.ejecutar(this.sesion, false);
        
        if (comando.getEstadoOperacion().getEstado() == 1) {
        	 Cliente.usuario = this.sesion.getUsuario();
        }
       
        
        //Cierro la conexion
        desconectarDelServidor();
		matarHilo();
		
        //Retorno el resultado de la creacion del usuario
        return comando.getEstadoOperacion();
    }
	
	
	public void enviarSolicitudDeAmistad(Usuario u)
	{
		SolicitudDeAmistad solicitud = (SolicitudDeAmistad)ComandoManejador.obtenerComando("solicitud_de_amistad");
		solicitud.setUsuario(this.sesion.getUsuario());
		solicitud.setAmigo(u);
		solicitud.ejecutar(this.sesion, false);
	}
	
	public void aceptarSolicitudDeAmistad(Usuario u)
	{
		AceptarAmistad aceptar = (AceptarAmistad)ComandoManejador.obtenerComando("aceptar_amistad");
		aceptar.setInvitador(u);
		aceptar.ejecutar(this.sesion, false);
	}
	
	
	
	public ArrayList<Usuario> obtenerAmigosEnComun(Usuario otroUsuario){
		try{
			AmigosEnComun amigosEnComun = (AmigosEnComun)  ComandoManejador.obtenerComando("amigos_en_comun");
			
			amigosEnComun.setUsuarioUno(Cliente.usuario);
			amigosEnComun.setUsuarioDos(otroUsuario);
			amigosEnComun.ejecutar(this.sesion, false);
			
			return amigosEnComun.getAmigosEnComun();
			
		} catch(Exception e){
			System.out.println(e.getMessage());
		}
		return null;
	}
	
	public Conversacion obtenerInvitacionesConversacion()
	{
		try{
			return MeAgreganConversacion.getConversacion();			
		} catch(Exception e){
			System.out.println(e.getMessage());
		}
		return null;
	}

	public Usuario obtenerUsuariosInvitaciones() {
		try{
			return MeAgreganConversacion.getUsuarioCreador();			
		} catch(Exception e){
			System.out.println(e.getMessage());
		}
		return null;
	}

	public String obtenerMensajesRecibidos() {
		try{
			return MensajeChat.getMensajeRecibido();			
		} catch(Exception e){
			System.out.println(e.getMessage());
		}
		return null;
	}
	
	public ArrayList<Usuario> obtenerAmigos() 
	{
		try{
			ObtenerAmigos comando = (ObtenerAmigos)  ComandoManejador.obtenerComando("obtener_amigos");
			comando.setUsuario(Cliente.usuario);
			comando.ejecutar(this.sesion, false);
			return comando.getAmigos();
		} catch(Exception e){
			System.out.println(e.getMessage());
		}
		return null;
	}	
	
	public ArrayList<Notificacion> obtenerNotificaciones()
	{
		try {
			ObtenerNotificaciones comando = (ObtenerNotificaciones)  ComandoManejador.obtenerComando("obtener_notificaciones");
			comando.setUsuario(Cliente.usuario);
			comando.ejecutar(this.sesion, false);
			return comando.getNotificaciones();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		return null;
	}	

	public ArrayList<Usuario> buscarUsuario(Usuario usuarioBuscado){
		try {
			BuscarUsuario busqueda = (BuscarUsuario) ComandoManejador.obtenerComando("buscar_usuario");
			
			busqueda.setUsuarioBuscado(usuarioBuscado);
			busqueda.setUsuario(Cliente.usuario);
			busqueda.ejecutar(this.sesion, false);
			
			return  busqueda.getUsuariosEncontrados();
			
		} catch (InterruptedException e) {
			System.out.println(e.getMessage());
			return null;
		}
	}	

	public void bloquearUsuario(Usuario usuarioABloquear) {
		try {
			BloquearUsuario busqueda = (BloquearUsuario) ComandoManejador.obtenerComando("bloquear_usuario");
			
			busqueda.setBloqueado(usuarioABloquear);
			busqueda.setBloqueador(Cliente.usuario);
			
			busqueda.ejecutar(this.sesion, false);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public MensajeComando login(Usuario u)
	{
		//Abro una conexion al servidor
		try{
			this.sesion = new ClienteSession(this.direccionIp, this.puerto);
		}catch (Exception e){
			System.out.println(e.getMessage());
		}
		
		
		//Me logueo
		LoginUsuario comando = (LoginUsuario) ComandoManejador.obtenerComando("login_usuario");
        comando.setUsuario(u);
        comando.ejecutar(this.sesion, false);
        Cliente.usuario = comando.getUsuario();
        
        if (comando.getEstadoOperacion().getEstado() == 1){	
        	Cliente.usuario = comando.getUsuario();
        	//Creo un hilo para la escucha del cliente con esta sesion
        	Thread clienteEscucha = new Thread (this.sesion);
        	clienteEscucha.start();
        }
        
        return comando.getEstadoOperacion();

	}
	
	public void desconectarDelServidor()
	{
		DesconectarDelServidor desconectar = (DesconectarDelServidor) ComandoManejador.obtenerComando("desconectar");
		desconectar.ejecutar(this.sesion, false);
	}

	public Integer agregoConversacion(Usuario usuario2, PanelDeChat panel) {
		try {
			AgregoConversacion conversacion = (AgregoConversacion) ComandoManejador.obtenerComando("agregar_conversacion");
			AgregoConversacion.setPanel(panel);
			
			conversacion.ejecutar(this.sesion, false);
			
			return conversacion.getConversacion().getId();
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
			return null;
		}
	}
	
	public void matarHilo()
	{
		this.sesion.matarHilo();
	}
	
	public ClienteSession getSesion() {
		return sesion;
	}

	public void setSesion(ClienteSession sesion) {
		this.sesion = sesion;
	}
	
	public String getDireccionIp() {
		return direccionIp;
	}

	public void setDireccionIp(String direccionIp) {
		this.direccionIp = direccionIp;
	}

	public int getPuerto() {
		return puerto;
	}

	public void setPuerto(int puerto) {
		this.puerto = puerto;
	}

	public static void main (String args[]) throws InterruptedException
	{
		
		Cliente c = null;
		try {
			c = new Cliente("127.0.0.1", 8089);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Usuario u = new Usuario();//123,"barcas",1,"passkword","Gabriel","Perez","Pregunta","Respuesta");
		
		//Creacion de nuevo usuario
		System.out.println(c.crearNuevoUsuario(u).getMensaje());
		
		//Login de usuario
		MensajeComando loginResult = c.login(u);
		
		//Si el login fue exitoso ya existe un hilo del lado del cliente en escucha para la recepcion de respuestas del servidor
		System.out.println(loginResult.getMensaje());
		
		if (loginResult.getEstado() == 1)
		{
			ObtenerNotificaciones notificaciones = (ObtenerNotificaciones) ComandoManejador.obtenerComando("obtener_notificaciones");
			notificaciones.ejecutar(c.getSesion(), false);
			
			BuscarUsuario buscarUsuario = (BuscarUsuario) ComandoManejador.obtenerComando("buscar_usuario");
			buscarUsuario.setUsuario(new Usuario());//123,"barcas",1,"passkword","Gabriel","Perez","Pregunta","Respuesta"));
			buscarUsuario.ejecutar(c.getSesion(), false);
			DesconectarDelServidor desconecta = (DesconectarDelServidor) ComandoManejador.obtenerComando("desconectar");
			desconecta.ejecutar(c.getSesion(), false);
			//c.sesion.cerrarSesion();
		}
		
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		Cliente.usuario = usuario;
	}
}
